
//push argument 1
@ARG
AD=M
@1
A=D+A
D=M
@SP
A=M
M=D
@SP
M=M+1

//pop pointer 1           
@SP
M=M-1
A=M
D=M
@3
A=A+1
M=D

//push constant 0
@SP
A=M
M=0
@SP
M=M+1

//pop that 0              
@SP
M=M-1
A=M
D=M
@THAT
A=M
M=D

//push constant 1
@SP
A=M
M=1
@SP
M=M+1

//pop that 1              
@SP
M=M-1
A=M
D=M
@THAT
A=M
A=A+1
M=D

//push argument 0
@ARG
AD=M
D=M
@SP
A=M
M=D
@SP
M=M+1

//push constant 2
@2
D=A
@SP
A=M
M=D
@SP
M=M+1

//sub
@SP
M=M-1
A=M
D=M
@SP
M=M-1
A=M
D=M-D
@SP
A=M
M=D
@SP
M=M+1

//pop argument 0          
@SP
M=M-1
A=M
D=M
@ARG
A=M
M=D

//label MAIN_LOOP_START
(FibonacciSeries$MAIN_LOOP_START)

//push argument 0
@ARG
AD=M
D=M
@SP
A=M
M=D
@SP
M=M+1

//if-goto COMPUTE_ELEMENT 
@SP
AM=M-1
D=M
@FibonacciSeries$COMPUTE_ELEMENT
D;JNE

//goto END_PROGRAM        
@FibonacciSeries$END_PROGRAM
0;JMP

//label COMPUTE_ELEMENT
(FibonacciSeries$COMPUTE_ELEMENT)

//push that 0
@THAT
AD=M
D=M
@SP
A=M
M=D
@SP
M=M+1

//push that 1
@THAT
AD=M
@1
A=D+A
D=M
@SP
A=M
M=D
@SP
M=M+1

//add
@SP
M=M-1
A=M
D=M
@SP
M=M-1
A=M
D=D+M
@SP
A=M
M=D
@SP
M=M+1

//pop that 2              
@THAT
A=M
D=A
@2
D=D+A
@R14
M=D
@SP
M=M-1
A=M
D=M
@R14
A=M
M=D

//push pointer 1
@3
D=A
@1
A=D+A
D=M
@SP
A=M
M=D
@SP
M=M+1

//push constant 1
@SP
A=M
M=1
@SP
M=M+1

//add
@SP
M=M-1
A=M
D=M
@SP
M=M-1
A=M
D=D+M
@SP
A=M
M=D
@SP
M=M+1

//pop pointer 1           
@SP
M=M-1
A=M
D=M
@3
A=A+1
M=D

//push argument 0
@ARG
AD=M
D=M
@SP
A=M
M=D
@SP
M=M+1

//push constant 1
@SP
A=M
M=1
@SP
M=M+1

//sub
@SP
M=M-1
A=M
D=M
@SP
M=M-1
A=M
D=M-D
@SP
A=M
M=D
@SP
M=M+1

//pop argument 0          
@SP
M=M-1
A=M
D=M
@ARG
A=M
M=D

//goto MAIN_LOOP_START
@FibonacciSeries$MAIN_LOOP_START
0;JMP

//label END_PROGRAM
(FibonacciSeries$END_PROGRAM)